package com.aokser.redisplugin.redis;

import com.aokser.redisplugin.exception.RedisPluginException;
import com.aokser.redisplugin.util.SerializationUtil;

import java.util.Collection;
import java.util.List;
import java.util.Set;


/**
 * 自定义redis插件客户端 
 * @version 1.0
 * @author aokser@foxmail.com
 */
public abstract class AbstractRedisPluginClient {
	
	
	/**
	 * 获取节点数
	 * @return int
	 */
	public abstract int getNodesSize();
	
	/**
	 * 获取数据类型
	 * @param key
	 * @return String
	 */
	public abstract String type(String key);
    
    /**
     * 根据Key获取String类型数据 
     * @param key 键值
     * @return String
     * @throws RedisPluginException
     */
    public String get(String key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 根据Key获取String类型数据 
     * @param key 键值
     * @return byte[]
     * @throws RedisPluginException
     */
    public byte[] get(byte[] key) throws RedisPluginException {
        return null;
    }
 
    /**
     * 设置String类型的数据  
     * @param key 键值
     * @param value 数据
     * @throws RedisPluginException
     */
    public void set(String key, String value) throws RedisPluginException {
        
    }
    
    /**
     * 设置String类型的数据  
     * @param key 键值字节数组
     * @param value 数据字节数组
     * @throws RedisPluginException
     */
    public void set(byte[] key, byte[] value) throws RedisPluginException{}
 
    /**
     * 删除键值为key的数据 
     * @param key 键值
     * @throws RedisPluginException
     */
    public void del(String key) throws RedisPluginException{}
    
    /**
     * 删除指定的key
     * @param key 键值字节数组
     * @throws RedisPluginException
     */
    public void del(byte[] key) throws RedisPluginException{}
 
    /**
     * 从头部添加元素 
     * @param key 键值
     * @param value 数据
     * @throws RedisPluginException
     */
    public void lpush(String key, String value) throws RedisPluginException{}
    
    /**
     * 从头部添加元素
     * @param key 键值字节数组
     * @param value 数据字节数组
     * @throws RedisPluginException
     */
    public void lpush(byte[] key, byte[] value) throws RedisPluginException{}
    
    /**
     * 从尾部添加元素 
     * @param key 键值
     * @param value 数据
     * @throws RedisPluginException
     */
    public void rpush(String key, String value) throws RedisPluginException{}
    
    /**
     * 从尾部添加元素
     * @param key 键值字节数组
     * @param value 数据字节数组
     * @throws RedisPluginException
     */
    
    /**
     * 从list 的头部删除元素，并返回删除元素 
     * @param key 键值
     * @return String
     * @throws RedisPluginException
     */
    public String lpop(String key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 从list 的头部删除元素，并返回删除元素 
     * @param key 键值字节数组
     * @return String
     * @throws RedisPluginException
     */
    public byte[] lpop(byte[] key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 从list 的尾部删除元素，并返回删除元素
     * @param key 键值
     * @return String
     * @throws RedisPluginException
     */
    public String rpop(String key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 从list 的尾部删除元素，并返回删除元素 
     * @param key 键值字节数组
     * @return byte[]
     * @throws RedisPluginException
     */
    public byte[] rpop(byte[] key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回key 对应list 的长度
     * @param key 键值
     * @return Long
     * @throws RedisPluginException
     */
    public Long llen(String key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回key 对应list 的长度 
     * @param key 键值字节数组
     * @return Long
     * @throws RedisPluginException
     */
    public Long llen(byte[] key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回指定范围的数据
     * @param key 键值
     * @param start 起始位置
     * @param end 结束位置
     * @return List<String>
     * @throws RedisPluginException
     */
    public List<String> lrange(String key, long start, long end) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回指定范围的数据 
     * @param key 键值字节数组
     * @param start 起始位置
     * @param end 结束位置
     * @return List<byte[]>
     * @throws RedisPluginException
     */
    public List<byte[]> lrange(byte[] key, long start, long end) throws RedisPluginException {
        return null;
    }
    
    /**
     * 向名称为key 的set 中添加元素 
     * @param key 键值
     * @param value 数据
     * @throws RedisPluginException
     */
    public void sadd(String key, String ... value) throws RedisPluginException {
    }
    
    /**
     * 向名称为key 的set 中添加元素
     * @param key 键值字节数组
     * @param value 数据字节数组
     * @throws RedisPluginException
     */
    public void sadd(byte[] key, byte[] ... value) throws RedisPluginException {
    }
    
    /**
     * 删除名称为key 的set 中的元素member 
     * @param key 键值
     * @throws RedisPluginException
     */
    public void srem(String key) throws RedisPluginException {
    }
    
    /**
     * 删除名称为key 的set 中的元素member 
     * @param key 键值字节数组
     * @throws RedisPluginException
     */
    public void srem(byte[] key) throws RedisPluginException {
    }
    
    /**
     * 返回名称为key 的set 的元素个数 
     * @param key 键值
     * @return long
     * @throws RedisPluginException
     */
    public long scard(String key) throws RedisPluginException {
        return 0;
    }
    
    /**
     * 返回名称为key 的set 的元素个数 
     * @param key 键值
     * @return long
     * @throws RedisPluginException
     */
    public long scard(byte[] key) throws RedisPluginException {
        return 0;
    }
    
    /**
     * 返回所有成员 
     * @param key 键值
     * @return Set<String>
     * @throws RedisPluginException
     */
    public Set<String> smembers(String key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回所有成员 
     * @param key 键值字节数组
     * @return Set<byte[]>
     * @throws RedisPluginException
     */
    public Set<byte[]> smembers(byte[] key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 设置hash field 为指定值，如果key 不存在，则先创建
     * @param key 键值
     * @param field 字段
     * @param value 值
     * @throws RedisPluginException
     */
    public void hset(String key, String field, String value) throws RedisPluginException {
    }
    
    /**
     * 设置hash field 为指定值，如果key 不存在，则先创建
     * @param key 键值
     * @param field 字段
     * @param value 值
     * @throws RedisPluginException
     */
    public void hset(byte[] key, byte[] field, byte[] value) throws RedisPluginException {
    }
    
    /**
     * 获取指定的hash field
     * @param key 键值
     * @param field 字段
     * @return String
     * @throws RedisPluginException
     */
    public String hget(String key, String field) throws RedisPluginException {
        return null;
    }
    
    /**
     * 获取指定的hash field
     * @param key 键值
     * @param field 字段
     * @return String
     * @throws RedisPluginException
     */
    public byte[] hget(byte[] key, byte[] field) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回hash 的所有value
     * @param key 键值
     * @return List<String>
     * @throws RedisPluginException
     */
    public List<String> hvals(String key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回hash 的所有value 
     * @param key 键值
     * @return Collection<byte[]>
     * @throws RedisPluginException
     */
    public Collection<byte[]> hvals(byte[] key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回hash 的所有field
     * @param key 键值
     * @return Set<String>
     * @throws RedisPluginException
     */
    public Set<String> hkeys(String key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回hash 的所有field 
     * @param key 键值
     * @return Set<String>
     * @throws RedisPluginException
     */
    public Set<byte[]> hkeys(byte[] key) throws RedisPluginException {
        return null;
    }
    
    /**
     * 返回指定hash 的field 数量 
     * @param key 键值
     * @return long
     * @throws RedisPluginException
     */
    public long hlen(String key) throws RedisPluginException {
        return 0;
    }
    
    /**
     * 返回指定hash 的field 数量 
     * @param key 键值
     * @return long
     * @throws RedisPluginException
     */
    public long hlen(byte[] key) throws RedisPluginException {
        return 0;
    }
    
    /**
     * 返回指定hash 的field 数量 
     * @param key 键值
     * @param field 字段
     * @throws RedisPluginException
     */
    public long hdel(String key, String field) throws RedisPluginException {
        return 0;
    }

    /**
     * 返回指定hash 的field 数量 
     * @param key 键值字节数组
     * @return field 字段
     * @throws RedisPluginException
     */
    public long hdel(byte[] key, byte[] field) throws RedisPluginException {
        return 0;
    }
    
    /**
     * 反序列化
     * @param bytes 字节数据
     * @return Object
     */
    public Object deserialize(byte[] bytes) {
        return SerializationUtil.hessianDeserialize(bytes);
    }
    
    /**
     * 序列化
     * @param obj 待序列化对象
     * @return byte[]
     */
    public byte[] serialize(Object obj) {
        return SerializationUtil.hessianSerialize(obj);
    }
    
    /**
     * 生成递增的整数值 
     * @param key 价值
     * @return long
     * @throws RedisPluginException
     */
    public long incr(String key) throws RedisPluginException {
        return -1;
    }
    
    /**
     * 生成递增的整数值 
     * @param key 价值
     * @return long
     * @throws RedisPluginException
     */
    public long incr(byte[] key) throws RedisPluginException {
        return -1;
    }

    /**
     * 订阅
     * @throws RedisPluginException
     */
    public abstract void subscribe(RedisPluginSubscribe redisPluginSubscribe,String channel)
            throws RedisPluginException;

    /**
     * 发布
     * @throws RedisPluginException
     */
    public abstract void publish(String channel, String message) throws RedisPluginException;

    public abstract Set<String> keys(String key) throws RedisPluginException;

    public abstract Set<byte[]> keys(byte[] key) throws RedisPluginException;
}
